package com.gradumate.client.gui;

import java.util.ArrayList;
import java.util.logging.Logger;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.gradumate.client.Element;
import com.gradumate.client.GraduMate;
import com.gradumate.client.gui.formulier.AfstudeerVoorstelIndienen;
import com.gradumate.client.service.GraduMateService;
import com.gradumate.client.service.GraduMateServiceAsync;
import com.gradumate.shared.Gebruiker;

/**
 * Klasse om een gebruiker te selecteren om mee in te loggen
 * @author IJsbrand
 *
 */
public class GebruikerSelectie {

	private AfstudeerVoorstelIndienen mp;
	
	// Asyncserver
	private GraduMateServiceAsync server = GWT.create(GraduMateService.class);

	// Tables waar data op terrecht komt
	private FlexTable flxTable;
	int row;

	// Logger
	private final Logger log = Logger.getLogger(GebruikerSelectie.class.getName());

	// Gebruiker
	private Gebruiker gebruiker;

	// Button
	private Button btnLoginAls;
	
	// Element
	private Element element = new Element();
	
	// Loading gif
	private Image imgLoadingGebruikerType;
	private Label lblLoadingGebruikerType;
	
	// Listbox Gebruiker
	private ListBox lstGebruiker;
	private Label lblGebruiker;

	/**
	 * Methode om een gebruiker te selecteren en vervolgens de mogelijke gebruikers te tonen om mee in te loggen.
	 */
	public GebruikerSelectie() {
		// Loading-gif plaatsen.
		GraduMate.setLoadingImage(true);
		GraduMate.clearStatusMessages();
		
		// Listbox voor Gebruiker
		lstGebruiker = new ListBox();
		lstGebruiker.setVisible(false);
		lblGebruiker = new Label("Selecteer een gebruiker");
		lblGebruiker.setVisible(false);
		
		// loading gif instellen
		imgLoadingGebruikerType = element.getLoadingGif();
		imgLoadingGebruikerType.setVisible(false);
		lblLoadingGebruikerType = element.getLabel("ophalen..");
		lblLoadingGebruikerType.setVisible(false);

		// Table aanmaken
		row = 0;
		flxTable = new FlexTable();
		flxTable.setCellSpacing(3);
		flxTable.setStyleName("datatableNoBorder");
		
		// Introductie
		FlexTable flxIntro = new FlexTable();
		flxIntro.setStyleName("datatableNoBorder");
		flxIntro.setWidget(0, 0, element.getHeaderLabel("Gebruiker selectie"));
		flxIntro.setWidget(1, 0, element.getLabel("Op deze pagina is het mogelijk om in te loggen als een gebruiker. "));
		flxIntro.setWidget(2, 0, element.getLabel("Selecteer eerst een gebruikertype en kies vervolgens een gebruiker."));

		// Gebruiker type
		Label lblGebruikerType = new Label("Gebruikertype");
		final ListBox lstGebruikerType = element.getGebruikerTypeListBox();
		flxTable.setWidget(row, 0, lblGebruikerType);
		flxTable.setWidget(row, 1, lstGebruikerType);
		flxTable.setWidget(row, 2, lblLoadingGebruikerType);
		flxTable.setWidget(row, 3, imgLoadingGebruikerType);
		row++;
		
		lstGebruikerType.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent e) {
				GraduMate.clearStatusMessages();
							
				// Gebruikertype 
				final int type = Integer.parseInt(lstGebruikerType.getValue(lstGebruikerType.getSelectedIndex()));
			
				// Laden zichtbaar maken
				imgLoadingGebruikerType.setVisible(true);
				lblLoadingGebruikerType.setVisible(true);
				
				if (type != 0 && (type > 0 && type < 8)) {
					
					server.getGebruikerByType(type, new AsyncCallback<ArrayList<Gebruiker>>() {
						
						public void onFailure(Throwable caught) {
							// Loading gif weg
							imgLoadingGebruikerType.setVisible(false);
							lblLoadingGebruikerType.setVisible(false);
							
							GraduMate.addAsyncError();
						}

						public void onSuccess(ArrayList<Gebruiker> gebruikers) {
							// Laden weghalen..
							imgLoadingGebruikerType.setVisible(false);
							lblLoadingGebruikerType.setVisible(false);
							
							// Button weer resetten.
							btnLoginAls.setEnabled(false);
							
							if (gebruikers.size() > 0) {
								
								lstGebruiker = new ListBox();
								lstGebruiker.addItem("Selecteer een gebruiker");
								for (Gebruiker gebruiker : gebruikers) {
									lstGebruiker.addItem(gebruiker.getVoornaam() + " " + gebruiker.getAchternaam(), gebruiker.getGebruikerEmail());
								}

								lstGebruiker.addChangeHandler(new ChangeHandler() {
									public void onChange(ChangeEvent e) {
										GraduMate.clearStatusMessages();
										
										// Button weer uitzetten.
										btnLoginAls.setEnabled(false);

										final String gebruikerEmail = lstGebruiker.getValue(lstGebruiker.getSelectedIndex());
										
										server.getGebruikerByEmail(gebruikerEmail, new AsyncCallback<Gebruiker>() {
											public void onFailure(Throwable caught) {
												// Opslaan in het logboek
												log.info("getGebruikerByEmail(" + gebruikerEmail + ") | AsyncCallback " + caught.getMessage());
												GraduMate.addAsyncError();
											}

											public void onSuccess(Gebruiker g) {
												if (g != null) {
													gebruiker = g;
													btnLoginAls.setEnabled(true);
												}
											}
										});
									}
								});
								lblGebruiker.setVisible(true);
								flxTable.setWidget(row, 0, lblGebruiker);
								flxTable.setWidget(row, 1, lstGebruiker);
								row++;
							} else {
								lstGebruiker.setVisible(false);
								lblGebruiker.setVisible(false);
								
								GraduMate.addErrorMsg("Geen gebruikers gevonden, probeer een andere gebruikerstype.");
								row++;
							}
						}
					});
				} else {
					imgLoadingGebruikerType.setVisible(false);
					lblLoadingGebruikerType.setVisible(false);
				}
			}
		});
		row++;
		
		// Button login als
		btnLoginAls = element.getButton("Login als", "Login als", "arrow_right.png");
		btnLoginAls.setEnabled(false);
		btnLoginAls.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent e) {
				// Loading gif plaatsen
				setButtonLoadingImage(true);
				
				// Type bepalen
				int type = gebruiker.getType();
				
				// Menu aanmaken
				GraduMate.setGebruiker(gebruiker);
				
				if (type == Gebruiker.TYPE_STUDENT) {
					new AfstudeerVoorstelIndienen();
				} else {
					new GebruikerHome(gebruiker);
				}
			}
		});

		// Gebruiker toevoegen button
		Button btnVoegGebruikerToe = element.getButton("Voeg gebruiker toe", "Voeg gebruiker toe", "user_add.png");
		btnVoegGebruikerToe.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent e) {
				new GebruikerToevoegen();
			}
		});
		
		// Login als Button
		FlexTable flxButton = new FlexTable();
		flxButton.setStyleName("datatableNoBorder");
		flxButton.setWidget(0, 0, btnLoginAls);
		flxButton.setWidget(0, 1, btnVoegGebruikerToe);
		row++;

		// Alle tabellen samenvoegen
		FlexTable flxAll = new FlexTable();
		flxAll.setWidget(0, 0, flxIntro);
		flxAll.setWidget(1, 0, flxTable);
		flxAll.setWidget(2, 0, flxButton);
		
		// Loading gif verwijderen
		GraduMate.setLoadingImage(false);
		
		// Elementen plaatsen
		RootPanel.get("main").clear();
		RootPanel.get("tabpanel").clear();
		RootPanel.get("menu").clear();
		RootPanel.get("main").add(flxAll);
	}
	
	/**
	 * Plaatje op de Save button plaatsen, leuke feature.
	 * @param show
	 */
	private void setButtonLoadingImage(boolean show) {
		if (show) {
			btnLoginAls.setHTML("Laden.. " + element.getImage("Laden..", "ajax-loader.gif").toString());
		} else {
			btnLoginAls.setHTML("Login als " + element.getImage("Login als", "array_right.png").toString());
		}
	}
}